import {isNull} from "@/utils/zzDouUtils/objUtil";

/**
 * 数组求和
 * @param array 数组
 * 在 JavaScript 中，数组求和的效率最高的方法是使用 reduce() 方法
 * 这个方法会对数组中的每个元素依次执行一个回调函数，最终返回一个累加器的值
 * 时间复杂度: O(n)
 */
export function arrSum(array) {
    return array.reduce((acc, cur) => acc + cur, 0);
}

/**
 * 如果数组的元素是对象，可以通过指定 reduce()方法的第二个参数来对对象中的某一个属性进行求和。
 * @param array 数组
 * @param key 键
 */
export function arrSumByKey(array, key) {
    return array.reduce((acc, cur) => acc + cur[key], 0);
}

/**
 * 为数组里的每一个对象填充一个对象
 * @param array 数组 array[i]={}
 * @param element 添加的对象 {}
 * 在不改变原始数组的情况下，为每个对象添加一个新属性，使用 Object.assign() 方法。
 * 这个方法将一个或多个源对象的属性复制到目标对象中，并返回目标对象。你可以使用它来为每个对象添加一个新属性
 */
export function fillObj(array, element) {
    return array.map(obj => {
        return Object.assign({}, obj, element);
    })
}

/**
 * @param array 数组 array[i]={}
 * @param key 键
 * @param value 值
 */
export function fillNode(array, key, value) {
    return array.map(obj => {
        let obj1 = {};
        obj1[key] = value;
        return Object.assign({}, obj, obj1);
    })
}

/**
 * 为数组中的每一个对象都删除一个键
 * @param array 数组 array[i]={}
 */
export function deleteNode(array, ...key) {
    return array.map(obj => {
        for (let i = 0; i < key.length; i++) {
            delete obj[key[i]];
        }
        return obj;
    })
}

/**
 * 将JSON字符串转为数组
 * @param str json字符串
 * @returns {any} 数组
 */
export function parseArr(str) {
    return JSON.parse(str);
}

/**
 * 将数组转为JSON字符串
 * @param array 数组
 * @returns {any} json字符串
 */
export function toJsonStr(array) {
    return JSON.stringify(array);
}

/**
 * 判断数组是否为空
 * @param array 数组
 * Array.isArray()是一个用于判断一个值是否为数组的方法
 * 它的返回值是一个布尔值，如果传入的参数是数组，则返回true，否则返回false
 * true：[]  [1, 2, 3]  new Array()
 * false：{} null undefined  123  'abc'
 */
export function isEmptyArr(array) {
    return isNull(array) || (isArray(array) && array.length === 0);
}

export function isNotEmptyArr(array) {
    return !isEmptyArr(array);
}

export function isArray(array) {
    return Array.isArray(array);
}

/**
 * 拷贝一个新数组
 * @param array 数组
 */
export function copyArr(array) {
    return [...array];
}

export function push(array, ...elements) {
    elements.forEach(element => {
        array.push(element);
    })
    return array;
}

export function pushAll(array, array2) {
    array2.forEach(element => {
        array.push(element);
    })
}

export function containAny(value, ...targets) {
    return targets.includes(value);
}

export function contain(array, element) {
    return array.includes(element);
}

/**
 * 去重
 */
export function removeDuplication(array) {
    let map = new Map();
    for (let i = 0; i < array.length; i++) {
        map.set(array[i], '');
    }
    return map.keys();
}


/**
 * 拆分字符串
 */
export function strSplit(str) {
    return [...str];
}


/**
 * 互换位置
 */
export function swap(arr, index1, index2) {
    arr[index1] = arr.splice(index2, 1, arr[index1])[0];
    return arr;
}

/**
 * 将数组中的对象的某个属性组装成set
 */
export function toSetByKey(arr, key) {
    let map = new Map();
    for (let i = 0; i < arr.length; i++) {
        map.set(arr[i][key], null);
    }
    let result = [];
    for (const key1 of map.keys()) {
        result.push(key1);
    }
    return result;
}
